package cliente;

import java.util.ArrayList;

import Gestores.Gestores;
import base_de_dados.Entidade;
import base_de_dados.GestorBD;
import produto.Produto;

public class LinhaFactura implements Comparable<LinhaFactura>, Entidade{
    private Factura factura;
    private Produto produto;
    private double quantidade;
    private int id;
    
    public enum Order
    {
	ASCENDING, DESCENDING
    }

    public enum Criteria
    {
	BYNAME, BYVALUE, BYINSERT
    }

    private static Order order = Order.ASCENDING;
    private static Criteria criteria = Criteria.BYVALUE;
    
    public LinhaFactura(int id, Factura factura, Produto produto, double quantidade) {
		super();
		this.factura = factura;
		this.produto = produto;
		this.quantidade = quantidade;
		this.id = id;
		
	}

	public Factura getFactura() {
		return factura;
	}

	public Produto getProduto() {
		return produto;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public double getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(double quantidade) {
		if(this.factura.isEntregue()) return;
		this.quantidade = quantidade;
	}

	public double totalLinha() {
		return this.produto.getPreco()*this.quantidade;
	}
	
	public static void setSort(Order o, Criteria c)
    {
	order = o;
	criteria = c;
    }

	@Override
	public int compareTo(LinhaFactura factura) {

		int result = 1;
		switch (criteria)
		{
		case BYINSERT:
		    result = 0;
		    break;

		case BYVALUE:
		    result = this.totalLinha() > factura.totalLinha() ? 1
			    : this.totalLinha() == factura.totalLinha() ? 0
				    : -1;
		    break;

		case BYNAME:
		    result = this.produto.getNome().compareTo(
			    factura.produto.getNome());
		    break;

		}
		return order == Order.ASCENDING ? result : -result;
	    
	}
	
	public boolean equals(Object arg0)
    {
	return produto.equals(((LinhaFactura) arg0).getProduto());
    }

	@Override
	public ArrayList<Object> getListaValores() {
		ArrayList<Object> list = new ArrayList<Object>();
		list.add(factura.getId());
		list.add(produto.getId());
		list.add(quantidade);
		return list;
	}

	@Override
	public boolean update() {
		if(this.factura.isEntregue()) return false;
		GestorBD bd = Gestores.getGestor_bd();
		if(bd != null){
			bd.update(this);
			boolean result = this.produto.update();
			return result;
		}
		return false;
	}

	@Override
	public boolean remover() {
		if(this.factura.isEntregue()) return false;
		GestorBD bd = Gestores.getGestor_bd();
		if(bd != null){
			bd.remove(this);
			return true;
		}
		return false;
	}

	@Override
	public ArrayList<String> getListaParametros() {
		ArrayList<String> list = new ArrayList<String>();
		list.add("factura");
		list.add("produto");
		list.add("quantidade");
		return list;
	}

	@Override
	public String getSearchString() {
		String search = "";
		if(factura != null){
			search += "factura = " + factura.getId();
		}else{
			search += "factura >= " + 0;
		}
		if(produto != null){
			search += " AND produto = " + produto.getId();
		}else{
			search += " AND produto >= " + 0;
		}
		if(quantidade >= 0){
			search += " AND quantidade = " + quantidade;
		}else{
			search += " AND quantidade >= " + 0;
		}
		return search;
	}

}
